home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Source Code / C / Frameworks / Grant's CGI Framework 1.0b12 / Util / ListSTAR.c < prev    next >
Text File  |  1995-12-09  |  9KB  |  316 lines

  1. /*****
  2.  *
  3.  *    Grant's CGI Framework
  4.  *        (Common Grant Interface :-)
  5.  *        by Grant Neufeld
  6.  *        http://arpp1.carleton.ca/grant/mac/grantscgi.html
  7.  *
  8.  *    ListSTAR.c
  9.  *
  10.  *    Standard functions for ListSTAR trigger & action applications.
  11.  *
  12.  *    You must call InitListSTARUtil in your application startup.
  13.  *    You must install ListSTARAEHandle as the event handler for the 9evt9Lis apple event
  14.  *    You must write the function:
  15.  *        void MyListSTARProcess ( LStarHdl theLStarHdl )
  16.  *        which is where you will, guess what, do your application specific processing
  17.  *        of the ListSTAR stuff.
  18.  *
  19.  *    Do not call any functions begining with lower case 'lstar' - you can use any of the
  20.  *    others - but read their comments first for details.
  21.  *
  22.  *    watch the homepage for future upgrades
  23.  *
  24.  *    notice of upgrades will be posted to macwwwtool@arpp1.carelton.ca
  25.  *        see http://arpp1.carleton.ca/list/macwwwtool.html for details
  26.  *
  27.  *
  28.  *    Copyright ©1995 by Grant Neufeld
  29.  *
  30.  *    http://arpp1.carleton.ca/grant/
  31.  *    gneufeld@ccs.carleton.ca
  32.  *    grant@acm.org
  33.  *
  34.  *    This source may be freely used as long as the copyright notice is kept in the source.
  35.  *    I ask that you let me know of any enhancements (read: bug fixes) to this code.
  36.  *    I would also like copies of (or discounts on) anything you produce this with, please.
  37.  *
  38.  *    See the License and Limited Warranty Agreement for all the legal stuff.
  39.  *
  40.  *****/
  41.  
  42. #include "MyConfiguration.h"
  43. #if kCompileWithListSTARCode
  44.  
  45.  
  46. #include <string.h>
  47.  
  48. #include "compiler_stuff.h"
  49. #include "globals.h"
  50.  
  51. #include "AEFunc.h"
  52. #include "DebugUtil.h"
  53. #include "MemoryUtil.h"
  54. #include "StringUtil.h"
  55.  
  56. /* ListSTAR.h processes differently for ListSTAR.c,
  57.     this is controlled by defining __LStarSegment__ */
  58. #define __LStarSegment__    1
  59. #include "ListSTAR.h"
  60. #undef    __LStarSegment__
  61.  
  62.  
  63. /***  CONSTANT DECLARATIONS  ***/
  64.  
  65. /***  LOCAL FUNCTION PROTOTYPES  ***/
  66.  
  67. static    void    lstarDisposeHandle            ( LStarHdl );
  68.  
  69. static    OSErr    lstarAEGetParamSpoolFile    ( AppleEvent *, AEKeyword, FSSpec *, char *, long );
  70.  
  71.  
  72. /***  FUNCTIONS  ***/
  73.  
  74. /* This initialization function MUST be called in the startup sequence of
  75.     your application */
  76. OSErr
  77. InitListSTARUtil ( void )
  78. {
  79.     OSErr                theErr;
  80.     AEEventHandlerUPP    theUPP;
  81.     StringHandle        liststarSpoolPath;
  82.     
  83.     /* install the ListSTAR apple event handler */
  84.     theUPP    = NewAEEventHandlerProc ( ListSTARAppleEvent );
  85.     theErr    = AEInstallEventHandler ( kAEClassStarNine, kAEIDListStarEvent, theUPP, 0L, false );
  86.     
  87.     if ( theErr != noErr )
  88.     {
  89.         /* liststar AE install failed */
  90.         return theErr;
  91.     }
  92.     
  93.     liststarSpoolPath = GetString ( krsListSTARSpoolPath );
  94.     
  95.     if ( liststarSpoolPath != nil )
  96.     {
  97.         HLock ( (Handle)liststarSpoolPath );
  98.         
  99.         /* locate ListSTAR's mail spool folder and set up it's FSSpec.
  100.             OSErr returned ignored */
  101.         theErr = FSMakeFSSpec ( nil, nil, *liststarSpoolPath, &gListSTARSpoolFolder );
  102.         
  103.         HUnlock ( (Handle)liststarSpoolPath );
  104.         
  105.         ReleaseResource ( (Handle)liststarSpoolPath );
  106.     }
  107.     
  108.     return theErr;
  109. } /* InitListSTARUtil */
  110.  
  111.  
  112. #pragma mark -
  113.  
  114. /*  */
  115. static void
  116. lstarDisposeHandle ( LStarHdl theLStarHdl )
  117. {
  118.     my_assert ( theLStarHdl != nil, "\plstarDisposeHandle: theLStarHdl is nil" );
  119.     
  120.     if ( (*theLStarHdl)->mailService != nil )
  121.     {
  122.         DisposePtr ( (Ptr)((*theLStarHdl)->mailService) );
  123.     }
  124.     if ( (*theLStarHdl)->senderName != nil )
  125.     {
  126.         DisposePtr ( (Ptr)((*theLStarHdl)->senderName) );
  127.     }
  128.     if ( (*theLStarHdl)->senderEmail != nil )
  129.     {
  130.         DisposePtr ( (Ptr)((*theLStarHdl)->senderEmail) );
  131.     }
  132.     if ( (*theLStarHdl)->mailSubject != nil )
  133.     {
  134.         DisposePtr ( (Ptr)((*theLStarHdl)->mailSubject) );
  135.     }
  136.     if ( (*theLStarHdl)->regExp != nil )
  137.     {
  138.         DisposePtr ( (Ptr)((*theLStarHdl)->regExp) );
  139.     }
  140.     if ( (*theLStarHdl)->senderMC != nil )
  141.     {
  142.         DisposePtr ( (Ptr)((*theLStarHdl)->senderMC) );
  143.     }
  144.     if ( (*theLStarHdl)->senderMCZone != nil )
  145.     {
  146.         DisposePtr ( (Ptr)((*theLStarHdl)->senderMCZone) );
  147.     }
  148.     if ( (*theLStarHdl)->senderMCEmail != nil )
  149.     {
  150.         DisposePtr ( (Ptr)((*theLStarHdl)->senderMCEmail) );
  151.     }
  152.     
  153.     DisposeHandle ( (Handle)theLStarHdl );
  154. } /* lstarDisposeHandle */
  155.  
  156.  
  157. /**  APPLE EVENT SUPPORT  **/
  158. #pragma mark -
  159.  
  160. #pragma segment AppleEvents
  161. /* AppleEvent Handler for the ListSTAR 9evt-9Lis event */
  162. pascal OSErr
  163. ListSTARAppleEvent ( AppleEvent *theAppleEvent, AppleEvent *TheReply, long Reference )
  164. {
  165.     OSErr        theErr;
  166. //    DescType    actualType;
  167.     Ptr            tempBuffer;
  168.     LStarHdl    theLStarHdl;
  169.     
  170.     theLStarHdl = (LStarHdl) MyNewHandleClear ( sizeof(LStarRecord), &theErr );
  171.     
  172.     if ( theLStarHdl == nil )
  173.     {
  174.         return theErr;
  175.     }
  176.     
  177.     /* store references to the apple event and reply records */
  178.     (*theLStarHdl)->appleEvent    = theAppleEvent;
  179.     (*theLStarHdl)->replyEvent    = TheReply;
  180.     
  181.     tempBuffer = MyNewPtr ( kLStarParamMaxSize, &theErr );
  182.     
  183.     if ( tempBuffer == nil )
  184.     {
  185.         DisposeHandle ( (Handle)theLStarHdl );
  186.         
  187.         return theErr;
  188.     }
  189.     
  190. //    actualType = (DescType) 'char';
  191.     
  192.     HLockHi ( (Handle)theLStarHdl );
  193.     
  194.     /* '----' - direct parameter: mailService */
  195.     theErr = AEGetParamString ( theAppleEvent, kLSTARmailService, &((*theLStarHdl)->mailService),
  196.         (char *)tempBuffer, kLStarParamMaxSize );
  197.     
  198.     /* 's9nm' - senderName */
  199.     theErr = AEGetParamString ( theAppleEvent, kLSTARsenderName, &((*theLStarHdl)->senderName),
  200.         (char *)tempBuffer, kLStarParamMaxSize );
  201.     
  202.     /* 's9em' - senderEmail */
  203.     theErr = AEGetParamString ( theAppleEvent, kLSTARsenderEmail, &((*theLStarHdl)->senderEmail),
  204.         (char *)tempBuffer, kLStarParamMaxSize );
  205.     
  206.     /* 's9sj' - mailSubject */
  207.     theErr = AEGetParamString ( theAppleEvent, kLSTARmailSubject, &((*theLStarHdl)->mailSubject),
  208.         (char *)tempBuffer, kLStarParamMaxSize );
  209.     
  210.     /* 's9re' - regExp */
  211.     theErr = AEGetParamString ( theAppleEvent, kLSTARregExp, &((*theLStarHdl)->regExp),
  212.         (char *)tempBuffer, kLStarParamMaxSize );
  213.     
  214.     /* 's9fn' - mailFile */
  215.     theErr = lstarAEGetParamSpoolFile ( theAppleEvent, kLSTARmailFile, &((*theLStarHdl)->mailFile),
  216.         (char *)tempBuffer, kLStarParamMaxSize );
  217.     
  218.     /* 's9mc' - senderMC */
  219.     theErr = AEGetParamString ( theAppleEvent, kLSTARsenderMC, &((*theLStarHdl)->senderMC),
  220.         (char *)tempBuffer, kLStarParamMaxSize );
  221.     
  222.     /* 's9mz' - senderMCZone */
  223.     theErr = AEGetParamString ( theAppleEvent, kLSTARsenderMCZone, &((*theLStarHdl)->senderMCZone),
  224.         (char *)tempBuffer, kLStarParamMaxSize );
  225.     
  226.     /* 's9me' - senderMCEmail */
  227.     theErr = AEGetParamString ( theAppleEvent, kLSTARsenderMCEmail, &((*theLStarHdl)->senderMCEmail),
  228.         (char *)tempBuffer, kLStarParamMaxSize );
  229.     
  230.     /* don't need the buffer any more */
  231.     DisposePtr ( tempBuffer );
  232.     
  233.     /* ••• need to add "MyAEGotRequiredParams" here */
  234.     
  235.     /* don't know how to determine difference between action and trigger yet,
  236.         so default to trigger. This can be changed to action by the
  237.         'MyListSTARProcess' function */
  238.     (*theLStarHdl)->method = ListSTAR_Trigger;
  239.     
  240.     /* allocate triggerValue */
  241.     (*theLStarHdl)->triggerValue = (long *) MyNewPtr ( sizeof(long), nil );
  242.     
  243.     if ( (*theLStarHdl)->triggerValue != nil )
  244.     {
  245.         /* default to failure unless the 'MyListSTARProcess' function determines success or error */
  246.         *((*theLStarHdl)->triggerValue)    = Trigger_failure;
  247.     }
  248.     
  249.     /* this is where the application specific ListSTAR event handling comes into play
  250.         the function "MyListSTARProcess" must be provided by the user of
  251.         this source code */
  252.     HUnlock                ( (Handle)theLStarHdl );
  253.     MyListSTARProcess    ( theLStarHdl );
  254.     HLock                ( (Handle)theLStarHdl );
  255.     
  256.     if ( ((*theLStarHdl)->method == ListSTAR_Trigger) &&
  257.         ((*theLStarHdl)->triggerValue != nil) )
  258.     {
  259.         /* if the event is a trigger, return the trigger value */
  260.         theErr = AEPutParamPtr ( TheReply, keyDirectObject, typeLongInteger,
  261.             (Ptr)((*theLStarHdl)->triggerValue), sizeof(long) );
  262.     }
  263.     else
  264.     {
  265.         /* otherwise, don't return any data */
  266.         theErr = noErr;
  267.     }
  268.     
  269.     HUnlock ( (Handle)theLStarHdl );
  270.     
  271.     /* deallocate memory */
  272.     lstarDisposeHandle ( theLStarHdl );
  273.     
  274.     return theErr;
  275. } /* ListSTARAppleEvent */
  276.  
  277.  
  278. #pragma segment AppleEvents
  279. /* private function to get an HTTPMethod from a parameter */
  280. static OSErr
  281. lstarAEGetParamSpoolFile ( AppleEvent *theAppleEvent, AEKeyword theAEKeyword, FSSpec *theFile, char *tempBuffer, long bufferSize )
  282. {
  283.     OSErr        theErr;
  284.     DescType    actualType;
  285.     Size        actualSize;
  286.     
  287.     my_assert ( theFile != nil, "\plstarAEGetParamSpoolFile: theFile ptr is nil" );
  288.     my_assert ( theAppleEvent != nil, "\plstarAEGetParamSpoolFile: theAppleEvent ptr is nil" );
  289.     my_assert ( tempBuffer != nil, "\plstarAEGetParamSpoolFile: tempBuffer ptr is nil" );
  290.     
  291.     /* put the message spool file name into the tempBuffer */
  292.     theErr = AEGetParamPtr
  293.         ( theAppleEvent, theAEKeyword, typeChar, &actualType, (Ptr)tempBuffer, bufferSize - 1, &actualSize );
  294.     
  295.     if ( theErr == noErr )
  296.     {
  297.         my_assert ( actualSize < bufferSize, "\plstarAEGetParamSpoolFile: actual param size too big" );
  298.         
  299.         /* terminate the buffer with a null byte, making it a C format string */
  300.         tempBuffer[actualSize] = nil;
  301.         
  302.         /* convert to pascal format string */
  303.         C2PStr ( tempBuffer );
  304.         /* make an fsspec using the mail spool directory and the tempBuffer as file name */
  305.         theErr = FSMakeFSSpec ( gListSTARSpoolFolder.vRefNum,
  306.             gListSTARSpoolFolder.parID, (StringPtr)tempBuffer, theFile );
  307.     }
  308.     
  309.     return theErr;
  310. } /* lstarAEGetParamHTTPMethod */
  311.  
  312.  
  313. #endif    /* kCompileWithListSTARCode */
  314.  
  315. /***  EOF  ***/
  316.